ホームに戻る
出典 :
関連 :
目次 :
WPFにおけるデータバインディング(Data Binding)とは
データの提供元(データソース)とUI要素を結びつけること。
一度バインディングを構成しておくと、データソースの値が変化した場合にUIの表示を自動的に更新したり、逆にUIからデータソースの値を更新できるようになる。
同様の概念はWindows Formsにも存在するが、より手順が体系化され、使いやすくなっている。
前提1 : ソース(Source)とターゲット(Target)
データバインディングには、ソース(参照元)とターゲット(反映先)があり、通常、ソースに加えた変更がターゲットに反映される。
(設定によっては逆方向や、双方向も可能。)
これは「ソースの変更をターゲットに通知する(
変更通知プロパティ)」の仕組みによって成り立つ。
ソースに設定できるのは(通常の)プロパティ、ターゲットに設定できるのは依存関係プロパティ(DependencyProperty)に限定される。
即ち、
データバインディングは依存関係プロパティをプロパティに同期させる処置と言える。
(
コントロール(UI要素)のプロパティはすべて依存関係プロパティとして実装されているため、いずれもターゲットに設定する際に特別な手順を必要としない。)
(リンク先を併せて参照のこと。)
WPFではデザインパターンとしてMVVM (Model - View - ViewModel) が推奨されており、これはWEB開発におけるMVCパターンと類似する。
データバインディングはMVVMの構成要素で、View と ViewModel を関連付ける操作(の一部)である。
データバインディングの実装例
View(XAML)でバインディングを構成
ViewModel (のインスタンス)を View のDataContext
として設定することがデータバインディングの基本である。
任意のクラスを ViewModel として新たに作成し、View のDataContext
に設定する。
ViewModel : MainViewModel.cs
namespace Sample
{
// ViewModel の本体
class MainViewModel
{
// プロパティ
public string Message { get; set; } = "サンプルメッセージ";
}
}
View : MainWindow.xaml
<
Window
(略)
>
<!-- MainViewModel を DataContext に設定 -->
<
Window.DataContext>
<
local:MainViewModel />
</
Window.DataContext>
:
<!-- TextBlock.Text を DataContext ( MainViewModel )の Message とバインド -->
<
TextBlock Text=
"{Binding Message}" />
View : MainWindow.xaml.cs
namespace Sample
{
public partial class MainWindow : Window
{
// コンストラクタ
public MainWindow()
{
InitializeComponent();
}
}
}
解説
上記は
MainViewModel
の
Message
プロパティが変更された際に、
MainWindow
上の
TextBlock
の表示に反映される例である。
まず
MainViewModel
を
Window
(
MainWindow
)の
DataContext
として設定している。
ここで、
local
は
MainViewModel
が属する名前空間(
Sample
)のエイリアスである。
MainViewModel
の
Message
プロパティを
TextBlock
の
Text
へとデータバインディングを行っているが、
MainViewModel
を
DataContext
として関連づけているため、プロパティ名(
Message
)のみを記述すればよい。
(
MainViewModel.Message
などとする必要は無い。)
DataContext
の指定はコードビハインドから行うことも可能である。
(ただしMVVMとしては推奨されない。)
その場合はコンストラクタ中で ViewModel のインスタンスを
DataContext
に代入する。
なお、XAMLから
DataContext
の指定を行う場合、
呼び出せる ViewModel のコンストラクタはデフォルトコンストラクタ(引数の無いコンストラクタ)に限定される。
このため、デフォルトコンストラクタ以外を呼びたい場合はコードビハインドで指定を行うなど回避策をとる必要がある。
また
DataContext
以外に、
RelativeSourceを用いることも可能である。
コードビハインドでバインディングを構成
以下のバインディングを構成する。
ソース | myDataObject (MyData )のMyDataProperty |
ターゲット | myText (TextBlock )のText |
// ソースオブジェクトの作成
// myDataObject.MyDataProperty をバインドソースとする
MyData myDataObject = new MyData(DateTime.Now);
System.Windows.Data.Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
// myText.Text をバインドターゲットとする
// (ターゲットは依存関係プロパティに限定されるため、Text ではなく TextProperty を指定する)
myText.SetBinding(TextBlock.TextProperty, myBinding);
// ソースオブジェクトの作成
// myDataObject.MyDataProperty をバインドソースとする
MyData myDataObject = new MyData(DateTime.Now);
System.Windows.Data.Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
// myText.Text をバインドターゲットとする
// (ターゲットは依存関係プロパティに限定されるため、Text ではなく TextProperty を指定する)
BindingOperations.SetBinding(myText, TextBlock.TextProperty, myBinding);
バインディングの書式

XAMLにおけるバインディングの書式は上記のようになる。
Binding
の子要素(プロパティ)を
,
(カンマ)で区切って書き連ね、全体を
{}
(ブレース)で囲む。
ここで、
Path
は省略可能で、
<!-- Path を明記 -->
<
TextBlock Text=
"{Binding Path=Message,
Mode=TwoWay}"/>
と
<!-- Path を省略 -->
<
TextBlock Text=
"{Binding Message,
Mode=TwoWay}"/>
は等価である。
下表に、設定可能な
Binding
の主要なプロパティを抜粋する。
これ以外は
Binding
クラスの
リファレンスを参照のこと。
プロパティ名 |
解説 |
取りうる値 |
備考 |
Path |
ソースプロパティのパス |
|
|
RelativeSource |
ソースオブジェクトを、ターゲットからの相対位置で指定する |
|
参考ページ(RelativeSource) |
Mode |
バインドの方向 (省略時はDefault) |
Default |
コントロールごとの既定値 |
リファレンス(BindingMode) |
OneTime | ソース⇒ターゲット(1回のみ) |
OneWay | ソース⇒ターゲット |
OneWayToSource | ターゲット⇒ソース |
TwoWay | ソース⇔ターゲット |
Converter |
使用するコンバーター |
|
参考ページ(コンバーター) |
ConverterParameter |
コンバーターに渡すパラメータ |
|